package pool

import (
	"google.golang.org/grpc"
)

// Conn 单grpc连接接口
type Conn interface {
	// Value 返回实际grpc连接类型 *grpc.ClientConn.
	Value() *grpc.ClientConn
	// Once 返回该链接是否为一次性
	Once() bool
	// Time 查看空闲时长		空闲时长通过扫描操作来确定，每扫一次视作时间计数器+1
	Time() int32
	// AddTime 时间计数器+1
	AddTime() error
	// Refresh 更新空闲时长
	Refresh() error
	// Close 减少GRPC连接参考值，而不是关闭它？池满则关闭
	Close() error
}

// Conn 是封装的 grpc.ClientConn. 以提供 close 和 value 方法.
type conn struct {
	cc   *grpc.ClientConn
	time int32
	once bool
}

// Value 访问 Conn 接口.
func (c *conn) Value() *grpc.ClientConn {
	return c.cc
}

func (c *conn) Time() int32 {
	return c.time
}

func (c *conn) AddTime() error {
	c.time += 1
	return nil
}

func (c *conn) Refresh() error {
	c.time = 0
	return nil
}

func (c *conn) Once() bool {
	return c.once
}

// Close 访问 Conn 接口.
func (c *conn) Close() error {
	c.cc = nil
	c.time = 0
	c.once = false
	return nil
}

func (p *pool) wrapConn(cc *grpc.ClientConn, once bool) *conn {
	return &conn{
		cc:   cc,
		time: 0,
		once: once,
	}
}
